"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
    if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
/**
 * 前面学习了类装饰器 ，类装饰默认接收一个参数参数 target  这个target就是这个类的构造函数
 *  可以操作这个构造函数的原型链 这样实例化的对象就会自动原型链攀升去后去装饰的数据
 *
 * 下面学习的是方法装饰器
 *    这一节是方法装饰器的基本用法
 *
 *  需要掌握
 *    基本API（能认识即可）
 *    接收的默认三个参数是什么（掌握）
 */
{
    const showDecorator = (target, propertyKey, descriptor) => {
        console.log("target", target); // target { show: [Function (anonymous)] }
        console.log("propertyKey", propertyKey); // show
        console.log("descriptor", descriptor); // descriptor {value: [Function (anonymous)],writable: true,enumerable: true,configurable: true}
        /**
         * 第一个参数
         *    如果是静态方法 那么就是构造函数
         *    如果不是静态方法是成员方法 那就是原型对象
         * 第二个参数是方法名称
         * 第三个参数是方法的属性特征
         */
        /**
         * 通过装饰器修改方法的内容
         */
        descriptor.value = () => {
            console.log("通过方法装饰器修改方法内容");
        };
    };
    class User {
        /**
         * 装饰器放在类上面就是类装饰器 放在方法上面就是方法装饰器
         */
        show() {
            console.log("hello world");
        }
    }
    __decorate([
        showDecorator,
        __metadata("design:type", Function),
        __metadata("design:paramtypes", []),
        __metadata("design:returntype", void 0)
    ], User.prototype, "show", null);
    new User().show(); // 通过方法装饰器修改方法内容
    /**
     * 可见 方法被我们给改了 输出的不是hello world  而是 通过方法装饰器修改方法内容
     *
     */
}
